module all_top (
        input			wire						clk         ,// 时钟输入
        input			wire						rst_n       ,// 复位信号，低电平有效

        input			wire		[ 2:0 ]		    key         ,// 三个按键输入

        input           wire                        echo        ,    // 超声波回声信号输入
        output          wire                        trig        ,// 超声波触发信号输出

        // 8个显示器的段选信号输出
        output          wire        [6:0]           hex1        ,
        output          wire        [6:0]           hex2        ,
        output          wire        [6:0]           hex3        ,
        output          wire        [6:0]           hex4        ,
        output          wire        [6:0]           hex5        ,
        output          wire        [6:0]           hex6        ,
        output          wire        [6:0]           hex7        ,
        output          wire        [6:0]           hex8        ,   

        //蜂鸣器和led显示
        output          wire                        beep        ,   // 蜂鸣器信号输出     
        output			wire		[ 17:0 ]			led         ,   // 4位LED输出

        //VGA显示需要用到的
        output			wire						vga_clk, // VGA时钟输出
        output			wire						h_sync,// 水平同步信号
        output			wire						v_sync,// 垂直同步信号
        output			wire		[ 7:0 ]			rgb_r,
        output			wire		[ 7:0 ]			rgb_g,
        output			wire		[ 7:0 ]			rgb_b
);


// 内部信号声明
reg			[ 27:0 ]			cnt			            ;  // 计数器

wire		[ 11:0 ]		    addr_h                  ;  // 水平地址
wire		[ 11:0 ]		    addr_v                  ;  // 垂直地址

// wire		[ 15:0 ]			rgb_data			    ;  // 用于RGB数据的16位宽线
wire		[ 23:0 ]			rgb_data			    ;


wire		[ 2:0 ]			    key_flag			    ;  // 按键标志
wire		[ 2:0 ]			    key_value			    ;  // 按键值
wire        [3:0]               key_out                 ;   //从FSM_KEY输出的按键

wire							data_out_vld			;


// data_o用于存储测距结果，是一个19位的宽数据总线
// wire        [18:0]              data_o                ;//测量的距离数
wire        [23:0]              data_o                  ;   //测量的距离数


//分频的时钟
wire							clk_1			        ;
wire                            clk_25                  ;


//时钟分频模块-————————————————————————————
//用于将系统时钟50MHz分频为1MHz时钟
clk_div u_clk_div(
	//in
    .Clk(clk)				,// 连接系统时钟50MHz
    .Rst_n(rst_n)			,// 连接复位信号
	//out
    .clk_us(clk_1)    		 // 输出1MHz时钟
);


//PLL时钟分频
pll	pll_inst (
	.areset ( ~rst_n ),
	.inclk0 ( clk ),
	// .c0 ( clk ), //50M
	.c1 ( clk_25 ) //25M
);


//hc-sr04超声波测距模块
distance_drive u_distance(
    //in
    .clk            ( clk           ),
    .clk_1          ( clk_1         ),// 输入1MHz时钟
    .rst_n          ( rst_n         ),
    //out
    .echo           ( echo          ),
    .trig           ( trig          ),
    .data_out_vld   ( data_out_vld  ),
    .distance_data  ( data_o        )
);
/*
// 用于驱动超声波测距硬件
hc_sr_driver u_hc_sr_driver(
    //in
    .Clk    (clk            ),          // 连接时钟信号
    .Rst_n  (rst_n          ),          // 连接复位信号
    .echo   (echo           ),          // 连接回声信号
    //out
    .trig   (trig           ),          // 连接触发信号输出
    .data_o (data_o         )           // 测距数据输出！！！！！！！！    
);
// */




/*ljf
//vga
vga_dirve u_vga_dirve(
    //in
    .clk      				( clk_25   ),
    .rst_n    				( rst_n    ),
    .rgb_data 				( rgb_data ),
    //out
    .vga_clk  				( vga_clk  ),
    .h_sync   				( h_sync   ),
    .v_sync   				( v_sync   ),
    .addr_h   				( addr_h   ),
    .addr_v   				( addr_v   ),
    .rgb_r    				( rgb_r    ),
    .rgb_g    				( rgb_g    ),
    .rgb_b    				( rgb_b    )
);
//vag数据
data_drive u_data_drive(
    //in
    .clk           			(clk),
    .vga_clk       			( vga_clk       ),
    .rst_n         			( rst_n         ),
    .addr_h        			( addr_h        ),
    .addr_v        			( addr_v        ),
    .data_vld      			( data_out_vld   ),
    .distance_data 			( distance_data ),
    //out
    .rgb_data      			( rgb_data      )
);
*/
	


// /*lx

// VGA驱动模块实例化
vga_dirve u_vga_dirve(
    //in
    .clk             ( clk          )       ,
    .rst_n           ( rst_n        )       ,
    .rgb_data        ( rgb_data     )       ,

    //out       
    .vga_clk         ( vga_clk      ),
    .h_sync          ( h_sync       ),
    .v_sync          ( v_sync       ),
    .rgb_r           ( rgb_r        ),
    .rgb_g           ( rgb_g        ),
    .rgb_b           ( rgb_b        ),
    .addr_h          ( addr_h       ),
    .addr_v          ( addr_v       )
);



// 数据驱动模块实例化
data_drive u_data_drive(
        //in
        .vga_clk        ( vga_clk       ),
        .rst_n          ( rst_n         ),
        .addr_h         ( addr_h        ),
        .addr_v         ( addr_v        ),
        .key            ( {key_value[ 2 ] && key_flag[ 2 ], key_value[ 1 ] && key_flag[ 1 ], key_value[ 0 ] && key_flag[ 0 ] } ),//按键控制
        .data_o         (data_o         ),   // 连接测距数据输入！！！！！！！！！！！！
        //out
        .rgb_data       ( rgb_data      )
);

// */





//数码管驱动模块，用于驱动八个 七段显示器
seg_driver u_seg_driver(
    //in
    .Clk            (clk            ),        // 连接时钟信号
    .Rst_n          (rst_n          ),     // 连接复位信号
    .data_o         (data_o         ),   // 测距数据输入！！！！！！！！！！！！！！！！！！

    //out   
    .hex1           (hex1           ),//连接七段显示器1的段选信号输出
    .hex2           (hex2           ),
    .hex3           (hex3           ),
    .hex4           (hex4           ),
    .hex5           (hex5           ),
    .hex6           (hex6           ),
    .hex7           (hex7           ),
    .hex8           (hex8           ) 
);


// /*

// beepled模块实例化，用于控制蜂鸣器和LED
beepled u_beepled(
    //in
    .Clk    (clk            ),        // 连接时钟信号
    .Rst_n  (rst_n          ),     // 连接复位信号
    .data_o (data_o         ),   // 连接测距数据输入
    //out
    .beep   (beep           ),       // 连接蜂鸣器信号输出
    .led    (led            )          // 连接LED信号输出
);

// */







// /*
// 按键消抖模块实例化
key_debounce u_key_debounce0(
//in
.clk   ( vga_clk ),
.rst_n ( rst_n ),
.key   ( key[ 0 ] ),

//out
.flag  ( key_flag[ 0 ] ),
.key_value  ( key_value[ 0 ] )
);

key_debounce u_key_debounce1(
//in
.clk   ( vga_clk ),
.rst_n ( rst_n ),
.key   ( key[ 1 ] ),

//out
.flag  ( key_flag[ 1 ] ),
.key_value  ( key_value[ 1 ] )
);

key_debounce u_key_debounce2(
.clk   ( vga_clk ),
.rst_n ( rst_n ),
.key   ( key[ 2 ] ),
.flag  ( key_flag[ 2 ] ),
.key_value  ( key_value[ 2 ] )
);
// */



/*
// 按键部分
FSM_KEY     inst_FSM_KEY(
        // in
        .sys_clk     (vga_clk   ),
        .sys_rst_n   (rst_n ),
        .key_in      (key       ),//输入的按键

        // out
        .key_out     (key_out   )
);
// */



endmodule // vga_top
